人工智能时代的算力挑战
图片来源:图虫创意
最近,OpenAI推出的聊天机器人ChatGPT真可谓是红到发紫。无论是做技术的、做投资的,还是普通网友,好像不聊几句ChatGPT就显得落伍了。当然,在一片对ChatGPT的追捧当中,也有一些不同的意见。比如,图灵奖得主、Meta的首席AI科学家杨立昆(Yann LeCun)就在社交媒体上发帖说:从底层技术看,ChatGPT并没有什么创新。与其说它是一次巨大的技术革新,倒不如说它是一个工程上的杰作。
杨立昆的这番言论一出,就遭遇到了网友的一片嘲讽,很多人甚至毫不客气地说,作为Meta的AI掌门人,这完全就是一种“吃不到葡萄说葡萄酸”的狡辩。由于Meta先前在同类产品上的失败经历,所以面对如此汹汹的舆论,杨立昆也是百口莫辩,只能就此噤声,不再对ChatGPT进一步发表评论。
不过,如果我们认真回味一下杨立昆的话,就会发现他的话其实是非常有道理的:虽然从表现上看,现在的ChatGPT确实非常惊艳,但从根本上讲,它依然是深度学习技术的一个小拓展。事实上,与之类似的产品在几年前已经出现过,所不同的是,ChatGPT在参数数量上要远远多于之前的产品,其使用的训练样本也要大得多。而它卓越的性能,其实在很大程度上只是这些数量优势积累到了一定程度之后产生的质变。
有意思的是,如果我们回顾一下深度学习的历史,就会发现这种利用神经网络进行机器学习的思路其实在上世纪50年代就有了,可以称得上是人工智能领域最古老的理论之一。早在1958年,罗森布拉特就曾经用这个原理制造了一台机器来识别字符。然而,在很长的一段时间内,这个理论却一直无人问津,即使现在被尊为“深度学习之父”的杰弗里·辛顿(Geoffrey Hinton)也长期遭受孤立和排挤。究其原因,固然有来自当时在人工智能领域占主导地位的“符号主义”的打压,但更为重要的是,当时的深度学习模型确实表现不佳。
直到本世纪初,这一切才发生了改变。长期蛰伏的深度学习理论终于翻身成为了人工智能的主流,一个个基于这一理论开发的模型如雨后春笋一般出现。从打败围棋高手的AlphaGo到识别出几亿种蛋白质结构的AlphaFold,从可以瞬间生成大师画作的Dall-E、Stable Diffusion到当今如日中天的ChatGPT,所有的这些在短短的几年之间涌现了。
那么,到底是什么原因让深度学习在过去的几年中扭转了长期的颓势,让它得以完成了从异端到主流的转换?我想,最为关键的一点就是算力的突破。
算力及其经济效应
所谓算力,就是设备处理数据、输出结果的能力,或者简而言之,就是计算的能力。它的基本单位是用“每秒完成的标准操作数量”(standardized operations per second,简称SOPS)来进行衡量。不过,由于现在的设备性能都非常高,因而在实践中用SOPS来衡量算力已经变得不那么方便。相比之下,“每秒完成的百万次操作数”(million operations per second,简称MOPS)、“每秒完成的十亿次操作数”(giga operations per second,简称GOPS),以及“每秒完成的万亿次操作数”(tera operations per second,简称TOPS)等单位变得更为常用。当然,在一些文献中,也会使用某些特定性能的设备在某一时间段内完成的计算量来作为算力的单位——其逻辑有点类似于物理学中用到的“马力”。比如,一个比较常用的单位叫做“算力当量”,它就被定义为一台每秒运算千万亿次的计算机完整运行一天所实现的算力总量。
那么,算力的意义究竟何在呢?关于这个问题,阿格拉沃尔(Ajay Agrawal)、甘斯(Joshua Gans)和戈德法布(Avi Goldfarb)在他们合著的《预测机器》(Prediction Machines,中文译名为《AI极简经济学》)中,曾经提出过一个有启发的观点:算力的成本将关系到AI模型的“价格”。经济学的原理告诉我们,在给定其他条件的前提下,人们对一种商品的需求量取决于该商品的价格。而对于两种性能相近,具有替代关系的商品来说,具有更低价格的那种商品会在市场上具有更高的竞争力。将这一点应用到人工智能领域,我们就可以找到深度学习理论为什么在几十年中都不被待见,却在最近几年中实现爆发的原因。
虽然深度学习的理论并不算困难,但是为了实现它,要投入的运算量是十分巨大的。在算力低下的时代,算力的单位成本非常高。在罗森布拉特提出深度学习思想雏形的那个年代,一台计算机的体积几乎和一间房子那么大,但即便如此,让它运算一个大一点的矩阵都还需要很长时间。虽然理论上我们也可以用深度学习来训练大模型并达到比较好的效果,但这样的成本显然是没有人能够承受的。而相比之下,符号学派的模型对于计算量的要求要小得多,因此这些模型的相对价格也要比深度学习模型来得低。在这种情况下,深度学习理论当然不会在市场上有竞争力。但是,当算力成本大幅度降低之后,深度学习模型的相对价格就降了下来,它的竞争力也就提升了。从这个角度看,深度学习在现阶段的胜利其实并不是一个纯粹的技术事件,在很大程度上,它还是一个经济事件。
改进算力的方法
那么,决定算力的因素有哪些呢?
为了直观起见,我们不妨以计算数学题来对此进行说明:如果我们要提高在单位时间内计算数学题的效率,有哪些方法可以达到这一目的呢?我想,可能有以下几种方法是可行的:一是找更多人一起来计算。如果一个人一分钟可以算一个题,那么十个人一分钟就可以算十个题。这样,即使每个人的效率没有提升,随着人数的增加,单位时间内可以计算的数学题数量也可以成倍增加。二是改进设备。比如,最早时,我们完全是依靠手算的,效率就很低。如果改用计算器,效率会高一点。如果使用了Excel,效率就可能更高。三是将问题转化,用更好的方法来计算。比如,计算从1加到100,如果按照顺序一个个把数字加上去,那么可能要算很久。但是,如果我们像高斯那样用等差数列求和公式来解这个问题,那么很快就可以计算出结果。
将以上三个方案对应到提升算力问题,我们也可以找到类似的三种方法:一是借助高性能计算和分布式计算;二是实现计算模式上的突破;三是改进算法——尽管严格地说这并不能让算力本身得到提升,但是它却能让同样的算力完成更多的计算,从某个角度看,这就好像让算力增加了一样。
1、高性能计算和分布式计算
从根本上讲,高性能计算和分布式计算都是通过同时动用更多的计算资源去完成计算任务,就好像我们前面讲的,用更多的人手去算数学题一样。所不同的是,前者聚集的计算资源一般是聚集在本地的,而后者动用的计算资源则可能是分散在网上的。
(1)高性能计算
先看高性能计算。高性能计算中,最为重要的核心技术是并行计算(Parallel Computing)。所谓并行计算,是相对于串行计算而言的。在串行计算当中,计算任务不会被拆分,一个任务的执行会固定占有一块计算资源。而在并行计算中,任务则会被分解并交给多个计算资源进行处理。打个比方,串行计算过程就像是让一个人独立按照顺序完成一张试卷,而并行计算则像是把试卷上的题分配给很多人同时作答。显然,这种任务的分解和分配可以是多样的:既可以是把计算任务分给多个设备,让它们协同求解,也可以是把被求解的问题分解成若干个部分,各部分均由一个独立的设备来并行计算。并行计算系统既可以是含有多个处理器的超级计算机,也可以是以某种方式互连的若干台独立计算机构成的集群。
从架构上看,并行计算可以分为同构并行计算(homogeneous parallel computing)和异构并行计算(heterogeneous parallel computing)。顾名思义,同构并行计算是把计算任务分配给一系列相同的计算单元;异构并行计算则是把计算任务分配给不同制程架构、不同指令集、不同功能的计算单元。比如,多核CPU的并行运算就属于同构并行,而CPU+GPU的架构就属于异构并行。
对比于同构并行,异构并行具有很多的优势。用通俗的语言解释,这种优势来自于各种计算单元之间的“术业专攻”,在异构架构之下,不同计算单元之间的优势可以得到更好的互补。正是由于这个原因,异构并行计算正得到越来越多的重视。
比如,现在越来越多的设备当中,都采用了将GPU和CPU混搭的架构。为什么要这么做呢?为了说明白这一点,我们需要略微介绍一下CPU和GPU的结构:从总体上看,无论是CPU还是GPU,都包括运算器(Arithmetic and Logic Unit,简称ALU)、控制单元(Control Unit,简称CL)、高速缓存器(Cache)和动态随机存取存储器(DRAM)。但是,这些成分在两者中的构成比例却是不同的。
在CPU当中,控制单元和存储单元占的比例很大,而作为计算单位的ALU比例则很小,数量也不多;而在GPU当中则正好相反,它的ALU比例很大,而控制单元和存储单元则只占很小的一个比例。这种结构上的差异就决定了CPU和GPU功能上的区别。CPU在控制和存储的能力上比较强,就能进行比较复杂的计算,不过它可以同时执行的线程很少。而GPU则相反,大量的计算单位让它可以同时执行多线程的任务,但每一个任务都比较简单。打个比喻,CPU是一个精通数学的博士,微积分、线性代数样样都会,但尽管如此,让他做一万道四则运算也很难;而GPU呢,则是一群只会四则运算的小学生,虽然他们不会微积分和线性代数,但人多力量大,如果一起开干,一万道四则运算分分钟就能搞定。
由于GPU的以上性质,它最初的用途是作为显卡,因为显卡负责图形和色彩的变换,需要的计算量很大,但每一个计算的复杂性都不高。当深度学习兴起之后,人工智能专家们发现GPU其实也很适合用来训练神经网络模型。因为在深度学习模型中,最主要的运算就是矩阵运算和卷积,而这些运算从根本上都可以分解为简单的加法和乘法。这样一来,GPU就找到了新的“就业”空间,开始被广泛地应用于人工智能。但是,GPU并不能单独执行任务,所以它必须搭配上一个CPU,这样的组合就可以完成很多复杂的任务。这就好像让一个能把握方向的导师带着很多肯卖力的学生,可以干出很多科研成果一样。正是在这种情况下,异构并行开始成为了高性能计算的流行架构模式。
不过,异构架构也是有代价的。相对于同构架构,它对于应用者的编程要求更高。换言之,只有当使用者可以更好地把握好不同计算单元之间的属性,并进行有针对性的编程,才可能更好地利用好它们。
除此之外,我们还必须认识到,哪怕是借助异构架构,通过并行运算来提升运算效率的可能也是有限的。根据阿姆达尔定律(Amdahl’s Law),对于给定的运算量,当并行计算的线程趋向于无穷时,系统的加速比会趋向于一个上限,这个上限将是串行运算在总运算中所占比例的倒数。举例来说,如果在一个运算中,串行运算的比例是20%,那么无论我们在并行运算部分投入多少处理器,引入多少线程,其加速比也不会突破5。这就好像,如果我要写一本关于生成式AI的书,可以将一些资料查找的工作交给研究助手。显然,如果我有更多的研究助手,写书的进度也会加快。但这种加快不是无限的,因为最终这本书什么时候写完,还要看我自己“码字”的速度。
(2)分布式计算
采用聚集资源的方式来增强算力的另一种思路就是分布式计算。和高性能计算主要聚集本地计算单位不同,分布式计算则是将分散在不同物理区域的计算单位聚集起来,去共同完成某一计算任务。比如,刘慈欣在他的小说《球状闪电》中就提到过一个叫做SETI@home的科研计划(注:这个项目是真实存在的),这个计划试图将互联网上闲置的个人计算机算力集中起来处理天文数据,这就是一个典型的分布式计算用例。
分布式计算的一个典型代表就是我们现在经常听说的云计算。关于云计算的定义,目前的说法并不统一。一个比较有代表性的观点来自于美国国家标准和技术研究所(NIST),根据这种观点,“云计算是一种按使用量付费的模式。这种模式对可配置的IT资源(包括网络、服务器、存储、应用软件、服务)共享池提供了可用的、便捷的、按需供应的网络访问。在这些IT资源被提供的过程中,只需要投入很少的管理和交流工作”。
这个定义很抽象、很学院派,我们可以用一个通俗的比喻来对其进行理解。在传统上,用户主要是通过调用自有的单一IT资源,这就好比每家每户自己发电供自己用;而云计算则好像是(用大量算力设备)建了一个大型的“发电站”,然后将“电力”(IT资源)输出给所有用户来用。
根据云服务提供者所提供的IT资源的不同,可以产生不同的“云交付模式”(Cloud Delivery Model)。由于IT资源的种类很多,因此对应的“云交付模式”也就很多。在各类新闻报道中,最常见的“云交付模式”有三种:
第一种是IaaS,它的全称是“基础设施作为服务”(Infrastructure-as-a-Service)。在这种交付模式下,云服务的提供者供给的主要是存储、硬件、服务器和网络等基础设施。
第二种是PaaS,它的全称是“平台作为服务”(Platform-as-a-Service)。在这种交付模式下,云服务的提供者需要供应的资源更多,以便为使用者提供一个“就绪可用”(ready-to-use)的计算平台,以满足他们设计、开发、测试和部署应用程序的需要。
第三种是SaaS,也就是“软件作为服务”(Software-as-a-Service)。在这种交付模式下,云服务提供者将成品的软件作为产品来提供给用户,供其使用。
有了以上不同的云交付模式,用户就可以根据自己的需要来选择相应的IT资源。比如,如果元宇宙的用户需要更多的算力或存储,而本地的机器无法满足,那么就可以通过从云端来获取“外援”。一个云端GPU不够,那就再来几个,按需取用,丰俭由人,既方便,又不至于产生浪费。
需要指出的是,尽管从理论上看云计算可以很好地承担巨大运算和存储需求,但其缺陷也是很明显的。比较重要的一点是,在执行云计算时,有大量的数据要在本地和云端之间进行交换,这可能会造成明显的延迟。尤其是数据吞吐量过大时,这种延迟就更加严重。对于用户来说,这可能会对其使用体验产生非常负面的效果。
那么怎么才能克服这个问题呢?一个直观的思路就是,在靠近用户或设备一侧安放一个能够进行计算、存储和传输的平台。这个平台一方面可以在终端和云端之间承担起一个中介的作用,另一方面则可以对终端的各种要求作出实时的回应。这个思想,就是所谓的边缘计算。由于边缘平台靠近用户,因而其与用户的数据交换会更加及时,延迟问题就可以得到比较好的破解。
2、超越经典计算——以量子计算为例
无论是高性能计算还是分布式计算,其本质都是在运算资源的分配上下功夫。但正如我们前面看到的,通过这种思路来提升算力是有很多障碍的。因此,现在很多人希望从计算方式本身来进行突破,从而实现更高的计算效率。其中,量子计算就是最有代表性的例子。
我们知道,经典计算的基本单位是比特,比特的状态要么是0,要么是1,因此经典计算机中的所有问题都可以分解为对0和1的操作。一个比特的存储单元只能存储一个0或者一个1。而量子计算的基本单位则是量子比特,它的状态则可以是一个多维的向量,向量的每一个维度都可以表示一个状态。这样一来,量子存储器就比经典的存储器有很大的优势。
考虑一个有 N物理比特的存储器,如果它是经典存储器,那么它只能存储2的N次方个可能数据当中的任一个;而如果它是量子存储器,那么它就可以同时存储2的N次方个数据。随着 N的增加,量子存储器相对于经典存储器的存储能力就会出现指数级增长。例如,一个250量子比特的存储器可能存储的数就可以达到2的250次方个,比现有已知的宇宙中全部原子数目还要多。
在进行量子计算时,数学操作可以同时对存储器中全部的数据进行。这样一来,量子计算机在实施一次的运算中可以同时对2的N次方个输入数进行数学运算。其效果相当于经典计算机要重复实施2的N次方次操作,或者采用2的N次方个不同处理器实行并行操作。依靠这样的设定,就可以大幅度节省计算次数。
为了帮助大家理解,我们可以打一个并不是太恰当的比方:玩过动作游戏的朋友大多知道,在游戏中,我们扮演的英雄经常可以使用很多招数,有些招数只能是针对单一对象输出的;而另一些招数则可以针对全体敌人输出。这里,前一类的单体输出招数就相当于经典计算,而后一类的群体输出招数就相当于量子计算。我们知道,在面对大量小怪围攻的时候,一次群体输出产生的效果可以顶得上很多次单体输出的招数。同样的道理,在一些特定情况下,量子计算可以比经典计算实现非常大的效率提升。
举例来说,大数因式分解在破解公开密钥加密的过程中有十分重要的价值。如果用计算机,采用现在常用的Shor算法来对数N进行因式分解,其运算的时间将会随着N对应的二进制数的长度呈现指数级增长。1994年时,曾有人组织全球的1600个工作站对一个二进制长度为129的数字进行了因式分解。这项工作足足用了8个月才完成。然而,如果同样的问题换成用量子计算来解决,那么整个问题就可以在1秒之内解决。量子计算的威力由此可见一斑。
但是,在看到量子计算威力的同时,我们也必须认识到,至少到目前为止,量子计算的威力还只能体现对少数几种特殊问题的处理上,其通用性还比较弱。事实上,现在见诸报道的各种量子计算机也都只能执行专门算法,而不能执行通用计算。比如,谷歌和NASA联合开发的D-Wave就只能执行量子退火(Quantum Annealing)算法,而我国研发的光量子计算机“九章”则是专门被用来研究“高斯玻色取样”问题的。尽管它们在各自的专业领域表现十分优异,但都还不能用来解决通用问题。这就好像游戏中的群体攻击大招,虽然攻击范围广,但是对每个个体的杀伤力都比较弱。因此,如果遇上大群的小怪,群体攻击固然厉害,但如果遇上防御高、血条厚的Boss,这种攻击就派不上用处了。
从这个角度看,如果我们希望让量子计算大发神威,就必须先找出适合量子计算应用的问题和场景,然后再找到相应的算法。与此同时,我们也必须认识到,虽然量子计算的研发和探索十分重要,但是它和对其他技术路径的探索之间更应该是互补,而不是替代的关系。
3、通过改进算法节约算力
如果说,通过高性能计算、分布式计算,以及量子计算等手段来提升算力是“开源”,那么通过改进算法来节约算力就是“节流”。从提升计算效率、减少因计算而产生的经济、环境成本而言,开源和节流在某种程度上具有同等重要的价值。
在ChatGPT爆火之后,大模型开始越来越受到人们的青睐。由于在同等条件下,模型的参数越多、训练的数据越大,它的表现就越好,因此为了追求模型的更好表现,现在的模型正在变得越来越大。我们知道,现在的ChatGPT主要是在GPT-3.5的基础上训练的。在它出现之前,GPT共经历了三代。GPT-1的参数大约为1.17亿个,预训练数据为5GB,从现在看来并不算多;到了GPT-2,参数量就增加到了15亿个,预训练数据也达到了40GB;而到了GPT-3,参数量则已经迅速膨胀到了骇人的1750亿个,预训练数据也达到了45TB。为了训练GPT-3,单次成本就需要140万美元。尽管OpenAI并没有公布GPT-3.5的具体情况,但可以想象,它的参数量和预训练数据上都会比GPT-3更高。为了训练这个模型,微软专门组建了一个由1万个V100GPU组成的高性能网络集群,总算力消耗达到了3640“算力当量”——也就是说,如果用一台每秒计算一千万亿次的计算机来训练这个模型,那么大约需要近十年才能完成这个任务。
如果任由这种“一代更比一代大”的趋势持续下去,那么在未来几年,对算力的需求将会出现爆炸性的增长。一项最新的研究估计,在5年之后,AI模型需要的算力可能会是现在的100万倍。很显然,由此产生的经济和环境成本将会是十分惊人的。
令人欣慰的是,目前已经有不少研究者希望改进算法、优化模型来减少对算力的需求,并且已经取得了一定的成就。比如,就在今年1月3日,来自奥地利科学技术研究所 (ISTA)的研究人员埃利亚斯·弗朗塔(Elias Frantar)和丹·阿里斯特尔(Dan Alistarh)合作进行了一项研究,首次针对 100至 1000亿参数的模型规模,提出了精确的单次剪枝方法SparseGPT。SparseGPT可以将GPT系列模型单次剪枝到 50%的稀疏性,而无需任何重新训练。以目前最大的公开可用的GPT-175B模型为例,只需要使用单个GPU在几个小时内就能实现这种剪枝。不仅如此,SparseGPT还很准确,能将精度损失降到最小。在进行了类似的修剪之后,这些大模型在训练时所需要的计算量就会大幅减少,其对算力的需求也就会相应下降。
关于提升算力、
支持人工智能发展的政策思考
随着ChatGPT引领了新一轮的人工智能热潮,市场上对算力的需求也会出现爆炸性的增长。在这种情况下,为了有力支撑人工智能的发展,就必须要通过政策的手段引导算力供给的大幅度增加。而要实现这一点,以下几方面的工作可能是最为值得重视的。
第一,应当加快对算力基础设施的建设和布局,提升对全社会算力需求的支持。如前所述,从目前看,分布式计算,尤其是其中的云计算是提升算力的一个有效之举。而要让云计算的效应充分发挥,就需要大力建设各类算力基础设施。唯有如此,才可以让人们随时随地都可以直接通过网络获得所需的算力资源。
这里需要指出的是,在布局算力基础设施的时候,应当慎重考虑它们的地域和空间分布,尽可能降低算力的成本。我们知道,不同的地区的土地、水、电力等要素的价格是不同的,这决定了在不同地区生产相同的算力所需要的成本也不尽相同。因此,在建设算力基础设施时,必须统筹全局,尽可能优化成本。需要指出的是,我国正在推进的“东数西算”工程就是这个思路的一个体现。由于我国东部各种资源的使用成本都要高于西部,因此在西部地区建立算力设施,就会大幅降低算力的供给成本,从而在全国范围内达到更优的配置效率。
第二,应当加强与算力相关的硬件技术及其应用的研发,为增加算力供应提供支持。与算力相关的硬件技术既包括基于经典计算的各种硬件,如芯片、高性能计算机等,也包括超越经典计算理论,根据新计算理论开发的硬件,如量子计算机等。从供给的角度看,这些硬件是根本,它们的性能直接关系到算力提供的可能性界限。因此,必须用政策积极促进这些硬件的攻关和研发。尤其是对于一些“卡脖子”的项目,应当首先加以突破。
这里需要指出的是,在进行技术研发的同时,也应该积极探索技术的应用。例如,我们现在已经在量子计算领域取得了一些成果,但是由于用例的缺乏,这些成果并没有能够转化为现实的应用。从这个意义上讲,我们也需要加强对技术应用的研究。如果可以把一些计算问题转化成量子计算问题,就可以充分发挥量子计算机的优势,实现计算效率的大幅提升。
第三,应当对算法、架构等软件层面的要素进行优化,在保证AI产品性能的同时,尽可能减少对算力的依赖。从降低AI计算成本的角度看,降低模型的算力需求和提升算力具有同等重要的意义。因此,在用政策的手段促进算力供给的同时,也应当以同样的力度对算法、架构和模型的优化予以同等的激励。
考虑到类似的成果具有十分巨大的社会正外部性,因此用专利来保护它们并不是最合适的。因此,可以积极鼓励对取得类似成功的人员和单位给予直接的奖励,并同时鼓励他们将这些成果向全社会开源;也可以考虑由政府出面,对类似的模型产品进行招标采购。如果有个人和单位可以按照要求提供相应的成果,政府就支付相应的费用,并对成果进行开源。通过这些举措,就可以很好地激励人们积极投身到改进模型、节约算力的事业中,也可以在有成果产出时,让全社会及时享受到这些成果。
总而言之,在人工智能突飞猛进的时代,算力可能是决定人工智能发展上限的一个关键因素。唯有在算力问题上实现突破,人工智能的发展才可能有根本保障。
阅读作者更多文章